package LimitedTimeGame.Day_0225;

/**
 * @author zxc
 * @date 2023/02/25 09:25
 **/

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 题目 ：
 * 题目详述 ：
 * 你有 n 枚花的种子。每枚种子必须先种下，才能开始生长、开花。播种需要时间，种子的生长也是如此。
 * 给你两个下标从 0 开始的整数数组 plantTime 和 growTime ，每个数组的长度都是 n ：
 * plantTime[i] 是 播种 第 i 枚种子所需的 完整天数 。每天，你只能为播种某一枚种子而劳作。无须 连续几天都在种同一枚种子，但是种子播种必须在你工作的天数达到 plantTime[i] 之后才算完成。
 * growTime[i] 是第 i 枚种子完全种下后生长所需的 完整天数 。在它生长的最后一天 之后 ，将会开花并且永远 绽放 。
 * 从第 0 开始，你可以按 任意 顺序播种种子。
 * 返回所有种子都开花的 最早 一天是第几天。
 *
 * 提示：
 * n == plantTime.length == growTime.length
 * 1 <= n <= 105
 * 1 <= plantTime[i], growTime[i] <= 104
 *
 */
public class EarliestFullBloom {
    /**
     * 思路 ：
     * 即，假设种子1和种子二的播种时间为 p1和p2，同时各自的生长时间为 g1 和 g2，同时满足条件 g1 > g2;
     * ===>
     * 1.（1）先播种种子1，再播种种子2
     * time1 = max(p1 + p2 + g2 , p1 + g1);
     * （2）先播种种子2，再播种种子1
     * time2 = p1 + p2 + g1;
     * ===>
     * 由于g1 > g2的，所以time1 必然是小于 time2的;
     * ===》
     * 结论 ：
     * 先播种生长时间较长的种子，必然比先播种生长时间较短 所需要总时间短;
     *
     * 2.对于种子根据生长时间大小进行排序即可;
     * ===》
     * 即，根据各个种子的生长时间来进行播种（先播种生长周期长的，再播种生长周期短的;）
     *
     * 3.注意 ：即，需要考虑 某个种子的生长时间是否 > 其下一个种子的播种+生长时间;
     *
     * @param plantTime
     * @param growTime
     * @return
     */
    public int earliestFullBloom(int[] plantTime, int[] growTime) {
        int len = growTime.length;
        /**
         * 思考 ：为什么选择新建一个list集合，来保存种子下标
         * 原因 ：
         * 1.为了使得plantTime 和 growTime是相互对应的，只需要对于新创建的集合list进行排序即可
         * ===》种子的播种时间和生长时间是一一对应的;
         * 2.若是选择对于plantTime数组，根据growTime进行排序的话，则种子的播种时间和生长时间就不是一一对应的;
         *
         */
        // 即，使用list集合存储 种子下标;
        List<Integer> list = new ArrayList<>();
        for(int i = 0 ; i < len ; i++){
            list.add(i);
        }
        // 将list集合中所存储的种子下标 按照growTime的顺序，从大到小进行排序;
        Collections.sort(list , (p1 , p2) -> growTime[p2] - growTime[p1]);
        // 最短总生长天数
        int result = 0;
        // 当前种子播种完成后，所处于的时间;
        int day = 0;
        for (Integer index : list) {
            day += plantTime[index];
            result = Math.max(result , day + growTime[index]);
        }
        return result;
    }
}